tg-me.com/golang_books/984
Last Update:
🧪 Go synctest — решение для нестабильных (flaky) тестов
Flaky-тесты в многопоточном Go-коде — боль. Новый экспериментальный инструмент synctest
из Go 1.24 решает эту проблему с помощью синтетического времени и контроля исполнения goroutine.
📌 Что это такое:synctest
— специальный режим, запускающий тесты в изолированной "песочнице", где:
• time.Sleep
не ждёт реального времени
• все goroutine исполняются детерминированно
• нет зависимости от планировщика и нагрузки ОС
🔧 Пример:
import "testing/synctest"
func TestSharedValue(t *testing.T) {
synctest.Run(func() {
var shared atomic.Int64
go func() {
shared.Store(1)
time.Sleep(1 * time.Microsecond)
shared.Store(2)
}()
time.Sleep(5 * time.Microsecond)
if shared.Load() != 2 {
t.Errorf("shared = %d, want 2", shared.Load())
}
})
}
⏱ Даже с
Sleep
, результат всегда стабилен. Без synctest
такой тест может иногда проваливаться.⚙️ Преимущества:
✅ Устранение race-условий при тестировании
✅ Нет задержек —
Sleep
срабатывает мгновенно ✅ Можно тестировать поведение с точностью до микросекунды
✅ Подходит для любых
atomic
, mutex
, select
, time.After
и др.🚫 Ограничения:
• Пока экспериментально: нужно запускать с
GOEXPERIMENT=synctest
• Не подходит для ввода-вывода, работы с сетью или временем вне "bubble"
📖 Подробнее:
https://victoriametrics.com/blog/go-synctest/
BY Golang Books
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/golang_books/984